<?php

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of AgregarCursosConstraints
 *
 * @author JeyDotC
 */
class ConflictoDeHorarios extends Plugin {

    private $curso;

    public function aroundModuleGuardarCurso(Cursos $curso) {
        $execute = true;
        /* @var $module MatriculaAcademica */
        $module = $this->baseObject;
        $this->curso = $curso;

        $matricula = $module->getMatricula();

        foreach ($matricula as /* @var $existingCourse Cursos */$existingCourse) {
            if ($this->checkForEquality($existingCourse)) {
                $module->addMessage(new Message("<p>No puedes matricular '{$this->curso->getMateria()->getNombreMateria()}' dos veces.</p>", "Repetici&oacute;n de materias: ", Message::ERROR));
                $execute = false;
                break;
            } else if ($this->checkForConflicts($existingCourse)) {
                $module->addMessage(new Message("<p>El curso [{$this->printCourse($this->curso)}] se cruza con [{$this->printCourse($existingCourse)}]</p>", "Conflicto de horarios: ", Message::ERROR));
                $execute = false;
                break;
            }
        }

        return $execute;
    }

    private function printCourse(Cursos $course) {
        return "{$course->getCursoPk()->getCodigoMateria()} - '{$course->getMateria()->getNombreMateria()}' Grupo: {$course->getCursoPk()->getGrupo()}";
    }

    private function checkForConflicts(Cursos $existingCourse) {
        foreach ($this->curso->getListaHorariosCursos() as /* @var $horarioCurso HorariosCursos */ $horarioCurso) {
            foreach ($existingCourse->getListaHorariosCursos() as /* @var $existingHorarioCurso HorariosCursos */ $existingHorarioCurso) {
                $inicio = MicrosoftDateFormatter::fromJSON($horarioCurso->getHorario()->getHoraInicial(), "U");
                $fin = MicrosoftDateFormatter::fromJSON($horarioCurso->getHorario()->getHoraFinal(), "U");

                $existingInicio = MicrosoftDateFormatter::fromJSON($existingHorarioCurso->getHorario()->getHoraInicial(), "U");
                $existingFin = MicrosoftDateFormatter::fromJSON($existingHorarioCurso->getHorario()->getHoraFinal(), "U");

                if (!($existingFin < $inicio || $fin < $existingInicio)) {
                    return true;
                }
            }
        }

        return false;
    }

    private function checkForEquality(Cursos $existingCourse) {
        $codigo = $this->curso->getCursoPk()->getCodigoMateria();
        $codigoExistente = $existingCourse->getCursoPk()->getCodigoMateria();
        return $codigo == $codigoExistente;
    }

}

?>
